package py.com.alfa.escriba.web.services.impl;

import java.util.List;

import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.DuplicateKeyException;

import py.com.alfa.escriba.exception.ErrorCode;
import py.com.alfa.escriba.exception.ServiceException;
import py.com.alfa.escriba.persistence.dao.DatoscomplementariosDAO;
import py.com.alfa.escriba.persistence.dao.ReferenciaDAO;
import py.com.alfa.escriba.persistence.dto.DatoscomplementariosDTO;
import py.com.alfa.escriba.persistence.dto.referencia.TabRefDTO;
import py.com.alfa.escriba.util.Utils;
import py.com.alfa.escriba.web.interceptor.InvocationContext;
import py.com.alfa.escriba.web.services.DatoscomplementariosService;

public class DatoscomplementariosServiceImpl implements DatoscomplementariosService{

  private DatoscomplementariosDAO datoscomplementariosDAO;
  private ReferenciaDAO referenciaDAO;

  public void setDatoscomplementariosDAO(DatoscomplementariosDAO datoscomplementariosDAO) {
    this.datoscomplementariosDAO = datoscomplementariosDAO;
  }
  public void setReferenciaDAO(ReferenciaDAO referenciaDAO) {
		this.referenciaDAO = referenciaDAO;
  }

  @Override
  public List<DatoscomplementariosDTO> listDatoscomplementarios(InvocationContext ic) throws ServiceException {
    List<DatoscomplementariosDTO> datoscomplementarioss =  datoscomplementariosDAO.listDatoscomplementarios();
    for(DatoscomplementariosDTO dc: datoscomplementarioss){
    	TabRefDTO tipoDato = new TabRefDTO();
    	tipoDato= referenciaDAO.getTabRefById(new Long(dc.getIdtipodato()));
    	dc.setTipoDato(tipoDato);
    }
    return datoscomplementarioss;
  }

  @Override
  public DatoscomplementariosDTO getDatoscomplementarios(Long id, InvocationContext ic) throws ServiceException {
    if (id == null || id <= 0)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

    DatoscomplementariosDTO dc =  datoscomplementariosDAO.getDatoscomplementariosById(id);
    
    if (dc == null)
        throw new ServiceException(ErrorCode.NO_DATA_FOUND,"datoscomplementarios.notfound", id);
    
    TabRefDTO tipoDato = new TabRefDTO();
	tipoDato= referenciaDAO.getTabRefById(new Long(dc.getIdtipodato()));
	dc.setTipoDato(tipoDato);

    return dc;
  }

  @Override
  public void deleteDatoscomplementarios(Long id, InvocationContext ic) throws ServiceException {
    if (id == null || id <= 0)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

    DatoscomplementariosDTO datoscomplementarios =  datoscomplementariosDAO.getDatoscomplementariosById(id);

    if(datoscomplementarios == null)
      throw new ServiceException(ErrorCode.NO_DATA_FOUND,"datoscomplementarios.notfound", id);

    try {
      datoscomplementariosDAO.deleteDatoscomplementarios(datoscomplementarios);
    }
    catch (DataIntegrityViolationException e){
      throw new ServiceException(ErrorCode.DATA_INTEGRITY_VIOLATION, "datoscomplementarios.constraint.violation", id);
    }

  }

  @Override
  public DatoscomplementariosDTO updateDatoscomplementarios(Long id, DatoscomplementariosDTO dto, InvocationContext ic) throws ServiceException {
    if (id == null || id <= 0)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

    if (null == dto)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","dto");

    DatoscomplementariosDTO datoscomplementarios = datoscomplementariosDAO.getDatoscomplementariosById(id);

    if (datoscomplementarios == null)
      throw new ServiceException(ErrorCode.NO_DATA_FOUND,"datoscomplementarios.notfound", id);

    datoscomplementarios.setCodigo(dto.getCodigo());
    datoscomplementarios.setDescripcion(dto.getDescripcion());
    datoscomplementarios.setIdtipodato(dto.getIdtipodato());
    datoscomplementarios.setLongitud(dto.getLongitud());
    datoscomplementarios.setPrecisiondato(dto.getPrecisiondato());
    datoscomplementarios.setActivo(dto.getActivo());
    datoscomplementarios.setMascara(dto.getMascara());
    datoscomplementarios.setTrn(dto.getTrn());
    datoscomplementarios.setIdusuario(dto.getIdusuario());
    datoscomplementarios.setFechacreacion(dto.getFechacreacion());
    datoscomplementarios.setIdusuariomodificacion(dto.getIdusuariomodificacion());
    datoscomplementarios.setFechamodificacion(dto.getFechamodificacion());
 

    Utils.validarDTO(dto);

    datoscomplementariosDAO.updateDatoscomplementarios(dto);

    return datoscomplementarios;
  }

  @Override
  public DatoscomplementariosDTO createDatoscomplementarios(DatoscomplementariosDTO dto, InvocationContext ic) throws ServiceException {
    if (dto == null)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","dto");

    try {

      Utils.validarDTO(dto);
      Utils.validarAlfaNumerico(dto.getCodigo());
      List<DatoscomplementariosDTO> dc= datoscomplementariosDAO.getDatosCompByListaValor(dto.getListadevalor());
      if(dc!=null || dc.size()>0 ){
    	  throw new ServiceException(ErrorCode.PARAMETER_ERROR,"datoscomplementarios.duplicate.lv","dto"); 
      }
      datoscomplementariosDAO.createDatoscomplementarios(dto);
    }
    catch (DuplicateKeyException e){
      throw new ServiceException(ErrorCode.DUPLICATE_KEY_EXCEPTION, "datoscomplementarios.duplicate.key");
    }

    return dto;
  }


}